import os

import cv2 as cv
import numpy as np
import pickle

from imutils import paths
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import sys,time


img_file = np.random.choice(list(paths.list_images(".")),1)[0]
img=cv.imread(img_file)
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img_gray = cv.equalizeHist(img_gray)  # 把图像的范围拉开

# 1. 创建级联分类器
face_cascade = cv.CascadeClassifier()
# 2. 引入训练好的可用于人脸识别的级联分类器模型
face_cascade.load("haarcascade_frontalface_alt.xml")
# 3. 用此级联分类器识别图像中的所有人脸信息，返回一个包含有所有识别的人联系系的列表
# 列表中每一个元素包含四个值：面部左上角的坐标(x,y) 以及面部的宽和高(w,h)
faces = face_cascade.detectMultiScale(img_gray)
# 4. 为图像中的所有面部画框
X=[]
for (x, y, w, h) in faces:
    cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    img_x=(img[y:y + h, x:x + w])
    img_x = cv.resize(img_x,(32,32))
    print(img_x.shape)
    X.append(img_x)

y_img = cv.resize(X[0], (32, 32))
y_img = y_img[:,:,0]
print(y_img.shape)

with open("knn", 'rb') as f:
    knn = pickle.load(f)


label =knn.predict([y_img.flatten()])
print(label)

fg,ax=plt.subplots()
cv.putText(img, # 要显示字体的图片
              f'{label}', # 要显示的内容
              (x,y-10), # 要显示的位置
              cv.FONT_HERSHEY_SIMPLEX, # 要使用的字体 -> 一般英文字体
              1, # 字体放大倍数
              (0,255,0), # 字体颜色
              2) # 字体线条粗细
ax.imshow(cv.cvtColor(img,cv.COLOR_BGR2RGB))



#plt.imshow(cv.cvtColor(img,cv.COLOR_BGR2RGB))
# plt.imshow(cv.cvtColor(X[0],cv.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()



'''
plt.figure(figsize = (10, 5))
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.imshow(cv.cvtColor(new_img,cv.COLOR_BGR2RGB))
plt.show()
'''
'''
X= np.array(X)
        # 载入已经创建的 knn 和 X_train 模型
with open("clf", 'rb') as f:
            clf = pickle.load(f)
with open("X_train", 'rb') as f:
            X_train = pickle.load(f)
label = clf.predict([X.ravel()])

        # 显示这两张图片
fg, ax = plt.subplots(1, 2)
ax[0].imshow(img, cmap = 'gray')
ax[1].imshow(X.reshape(32, 32), cmap = 'gray')
ax[1].set_title(label, size = 20)

plt.tight_layout()
plt.show()
'''
